iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Software Development

闖入DLL的世界 DLL我要進來了哦系列 第 13

第十三天:講解注入的程式碼運作機制

  • 分享至 

  • xImage
  •  

大家好我是Andy,今天是第十三天,馬上就要迎來開學之後的第一個連假了,有沒有甚麼計劃呢,要出去玩還是要在家苦讀,或是打打電動消遣消遣,好吧廢話不多說我們直接進入今天的主題。


昨天我們講了注入DLL,我們今天就來講解一下程式碼。

程式碼

遠端注入

#include <Windows.h>
void inject(int PID,char* Path){
	//獲取進程句柄
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
	//申請一個記憶體給Path
	LPVOID Return = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT, PAGE_READWRITE);
	//寫入到VirtualAllocEx申請的記憶體內
	WriteProcessMemory(hProcess, Return, Path, strlen(Path) + 1, NULL);
	//LoadLibrary的函數庫
	HMODULE hModule = LoadLibrary("Kernel32.dll");

	LPTHREAD_START_ROUTINE lpStartAddress = LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "LoadLibraryA"));

	CreateRemoteThread(hProcess, NULL, 0, lpStartAddress,Return, 0, NULL);
	

}
int main() {
	const char* p = "D:\\鐵人賽DLL\\Dll5\\Debug\\Dll5.dll";
	inject(26340, (char*)p);
	return 0;
}

OpenProcess

hProcess

使用OpenProcess來打開一個已存在的進程,並返回HANDDLE類型的句柄
PROCESS_ALL_ACCESS這是一個定義的參數還有PROCESS_CREATE_PROCESS這是創建線程的,簡單來說PROCESS_ALL_ACCESS就是一個讓她拿取所有權線的參數


VirtualAllocEx

使用VirtualAllocEx透過句柄hProcess申請一個路徑+1的空間

MEM_COMMIT

這是Microsoft定義中的一個參數,為指定的東西保留分配內存做使用,也保證在調用者以後最初訪問存儲器的時候,內容將為零。
其他也有像是MEM_RESERVE、MEM_RESET等等

PAGE_READWRITE

Microsoft定義中的一個參數,這個也有點像是權限的東西目前在這的PAGE_READWRITE是可被應用程序讀寫,其他也有READONLY、EXECUTE、EXECUTE_READ


WriteProcessMemory

很淺顯易懂就是把東西寫進記憶體裡,而這邊的Return是一個要寫的內存地址所以才會是VirtualAllocEx的一個返回函數,後面就是要寫入的路徑以及路徑大小一樣是路徑+1。

結語

今天將昨天的程式碼都解釋一遍,這樣也會比較好理解,不然有時候打完就忘記了還要回過頭去看,這樣我覺得沒有學到根本去,好了明天要上課,打完有點累趕緊洗洗睡,我們明天見,seeya


上一篇
# 第十二天:遠程注入DLL
下一篇
第14天:釋放DLL
系列文
闖入DLL的世界 DLL我要進來了哦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言